package com.general.framework.example.proxy.cglibProxy;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 *
 * 1 JDK动态代理
 *         简介: JDK 动态代理是 Java 内置的一种代理机制，它只适用于代理接口实现类，也就是说目标对象必须实现一个或多个接口。
 *         实现方式: 使用 java.lang.reflect.Proxy 类和 InvocationHandler 接口来实现动态代理。
 *         优点: 简单易用，直接支持接口代理，适用于大多数场景。
 *         缺点: 只能代理实现了接口的类，无法代理普通的类。
 *
 *
 *2 CGLIB 动态代理
 *         简介: CGLIB (Code Generation Library) 是一个第三方库，可以动态生成字节码来创建代理对象。与 JDK 动态代理不同，CGLIB 可以代理普通类（非接口）。
 *         实现方式: 通过继承目标类并重写方法实现代理，这也是为什么 CGLIB 不能代理 final 类或 final 方法。
 *         优点: 可以代理没有实现接口的类，性能通常比 JDK 代理快。
 *         缺点: 需要额外的库（CGLIB），不能代理 final 类或方法。
 *
 */

public class CglibProxy implements MethodInterceptor {
    private Object target;

    public Object getProxyInstance(Object target) {
        this.target = target;
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(this.target.getClass());
        enhancer.setCallback(this);
        return enhancer.create();
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("cglib proxy before");
        Object result = methodProxy.invokeSuper(o, objects);
        System.out.println("cglib proxy after");
        return result;
    }

    public static void main(String[] args) {
        UserService userService = new UserService();
        CglibProxy cglibProxy = new CglibProxy();
        UserService userDao = (UserService) cglibProxy.getProxyInstance(userService);
        userDao.addUser("cglib");
    }
}
